// 有这样一个代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

//全局变量 , 父和子都可用
//int global = 100;
//
//int main()
//{
//	printf("我是父进程 , 我的 pid = %d , 我的父进程 pid = %d , global = %d , &global = %p\n", getpid(),getppid(),global,&global);
//	printf("-----------------------------------------------------------------------\n");
//	//创建子进程 
//	pid_t id = fork();		
//
//	if(id < 0)
//	{
//		printf("fork err !\n");
//		return 1;
//	}	
//	else if(id == 0)
//	{
//		//child
//		while(1)
//		{
//			printf("我是子进程 , 我的 pid = %d , 我的父进程 pid = %d , global = %d , &global = %p\n",getpid() , getppid(),global++,&global);
//			sleep(1);
//			//子进程修改全局 global 
//		}
//	}	
//	else
//	{
//		//father
//		while(1)
//		{		
//			printf("我是父进程 , 我的 pid = %d , 我的父进程 pid = %d , global = %d , &global = %p\n",getpid() , getppid(),global,&global);
//			sleep(1);
//		}
//	}
//
//	return 0;
//}


////////////////////////////// 演示 , 各个区域规则


//int g_unval;
//int g_val = 100;
//
//
//int main(int argc, char *argv[], char *env[])
//{	
//
//   const char *str = "helloworld";
//   printf("code addr: %p\n", main);
//   printf("init global addr: %p\n", &g_val);
//   printf("uninit global addr: %p\n", &g_unval);
//
//   static int test = 10;
//   char *heap_mem = (char*)malloc(10);
//   char *heap_mem1 = (char*)malloc(10);
//   char *heap_mem2 = (char*)malloc(10);
//   char *heap_mem3 = (char*)malloc(10);
//   printf("heap addr: %p\n", heap_mem); //heap_mem(0), &heap_mem(1)
//   printf("heap addr: %p\n", heap_mem1); //heap_mem(0), &heap_mem(1)
//   printf("heap addr: %p\n", heap_mem2); //heap_mem(0), &heap_mem(1)
//   printf("heap addr: %p\n", heap_mem3); //heap_mem(0), &heap_mem(1)
//
//   printf("test static addr: %p\n", &test); //heap_mem(0), &heap_mem(1)
//   printf("stack addr: %p\n", &heap_mem); //heap_mem(0), &heap_mem(1)
//   printf("stack addr: %p\n", &heap_mem1); //heap_mem(0), &heap_mem(1)
//   printf("stack addr: %p\n", &heap_mem2); //heap_mem(0), &heap_mem(1)
//   printf("stack addr: %p\n", &heap_mem3); //heap_mem(0), &heap_mem(1)
//
//   printf("read only string addr: %p\n", str);
//
//   for(int i = 0 ;i < argc; i++)
//   {
//       printf("argv[%d]: %p\n", i, argv[i]);
//   }
//
//   for(int i = 0; env[i]; i++)
//   {
//       printf("env[%d]: %p\n", i, env[i]);
//   }
//
//   return 0;
//}



///////////  验证虚拟地址可以把物理地址无序变有序

int main()
{

   // 堆上申请空间 
   char *heap_mem = (char*)malloc(10);
   char *heap_mem1 = (char*)malloc(10);
   char *heap_mem2 = (char*)malloc(10);
   char *heap_mem3 = (char*)malloc(10);
   printf("heap addr: %p\n", heap_mem); //heap_mem(0), &heap_mem(1)
   printf("heap addr: %p\n", heap_mem1); //heap_mem(0), &heap_mem(1)
   printf("heap addr: %p\n", heap_mem2); //heap_mem(0), &heap_mem(1)
   printf("heap addr: %p\n", heap_mem3); //heap_mem(0), &heap_mem(1)

   return 0;


}
